﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CourseUtils;

namespace NumberToText
{
    public class Program
    {
        public static string ConvertNumberToWords(int number)
        {
            if (number < 0)
            {
                throw new IndexOutOfRangeException("Индекс находится вне границ массива");
            }
            int[] counter = new int[4]; // количество миллиардов, миллионов, сотен тысяч и тысяч в числе
            string[,] stringArray = {{"миллиард ", "миллиарда ", "миллиардов "},
                                     {"миллион ", "миллиона ", "миллионов "},
                                     {"тысяча ", "тысячи ", "тысяч "}};
                
            counter[0] = (number - (number % 1000000000)) / 1000000000; // записали количество миллиардов
            counter[1] = ((number % 1000000000) - (number % 1000000)) / 1000000; // записали количество миллионов
            counter[2] = ((number % 1000000) - (number % 1000)) / 1000; //записали количество тысяч
            counter[3] = number % 1000; //записали количество единиц
            string result = "";
            if (counter[0] != 0) result += ThreeDigitsToWords(counter[0], false); //пишем словами миллиарды
            if ((counter[0] != 0)&&(counter[0] / 10 % 10 == 1)) result += stringArray[0, 2];          //Добавляем слово"миллиард"
            else if (counter[0] != 0) switch (counter[0] % 10)
                {
                    case 1: 
                        result += stringArray[0, 0]; 
                        break;
                    case 2: case 3: case 4: 
                        result += stringArray[0, 1]; 
                        break;
                    case 0: case 5: case 6: case 7: case 8: case 9: 
                        result += stringArray [0,2]; 
                        break;

                }
            if (counter[1] != 0) result += ThreeDigitsToWords(counter[1], false); // пишем словами миллионы
            if ((counter[1] != 0)&&(counter[1] / 10 % 10 == 1)) result += stringArray[1, 2];           //Добавляем слово"миллион"
            else if (counter[1] != 0) 
                switch (counter[1] % 10)
                {
                    case 1: 
                        result += stringArray[1, 0]; 
                        break;
                    case 2: case 3: case 4: 
                        result += stringArray[1, 1]; 
                        break;
                    case 0: case 5: case 6: case 7: case 8: case 9: 
                        result += stringArray [1,2]; 
                        break;
                }
            if (counter[2] != 0) result += ThreeDigitsToWords(counter[2], true); // пишем словами тысячи
            if ((counter[2] != 0)&&(counter[2] / 10 % 10 == 1)) result += stringArray[2, 2];           //Добавляем слово"тысяча"
            else if (counter[2] != 0) switch (counter[2] % 10)
                {
                    case 1: 
                        result += stringArray[2, 0]; 
                        break;
                    case 2: case 3: case 4: 
                        result += stringArray[2, 1]; 
                        break;
                    case 0: case 5: case 6: case 7: case 8: case 9: 
                        result += stringArray[2, 2]; 
                        break;
                }
            if (counter[3] != 0) result += ThreeDigitsToWords(counter[3], false); // пишем словами единицы
            if (result == "") result = "ноль";

            return result.Trim();
        }

        static string ThreeDigitsToWords(int threeDigNumber, bool isThousands)
        { 
            string result = "";
            string[] units =  {"один","два","три","четыре","пять","шесть", "семь","восемь","девять"}; 
            string[] tens  = {"десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят", "восемьдесят","девяносто"}; 
            string[] hundreds = {"сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"}; 
            string[] secondten = {"одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать","шестнадцать","семнадцать","восемнадцать","девятнадцать"}; 
            string[] female = {"одна","две"};
            int[] digits = new int[3];
            digits[0]= threeDigNumber / 100; //старший разряд
            digits[1]= (threeDigNumber / 10) % 10; //средний разряд
            digits[2] = threeDigNumber % 10; //младший разряд
            if (digits[0] != 0) result += hundreds[digits[0] - 1] + " "; //пишем сотни
            if (digits[1] != 0)                                          //пишем десятки
            {
                if (digits[1] == 1 && digits[2] != 0)
                {
                    result += secondten[digits[2] - 1] + " ";
                    return result;
                }
                else
                {
                    result += tens[digits[1] - 1] + " ";
                }
            }
            if (digits[2] != 0)                                         //пишем единицы
            {
                if (((digits[2] > 2) & (digits[1] != 1)) || (!isThousands)) 
                {
                    result += units[digits[2] - 1] + " ";
                }
                else
                {
                    result +=(female[digits[2]-1]+" ");
                } 
                    
                
            }
            return result;
        }
               
        static void Main(string[] args)
        {

            int number = IOHelpers.ReadIntFromConsole("Введите число");
            string numberInWords = ConvertNumberToWords(number);
            Console.WriteLine(numberInWords);
            Console.ReadKey();
                       
        }
    }
}
